import { AssetManager, JsonAsset, resources } from "cc";

/*****************************
 *@file: ResourceManage
 *@author: 陈吕唐
 *@desc: 资源管理器(负载加载动态资源给模块使用)
 *@date: 2024-02-24	10:23
 *****************************/
export default class ResourceManageSingleton {
    /****************************************************************************************************************
     *Readonly 常量
     ****************************************************************************************************************/
    private static _singleton: ResourceManageSingleton;

    /****************************************************************************************************************
    *Property 定义变量
    ****************************************************************************************************************/
    private jsonMap: Map<string, any> = new Map();
    /****************************************************************************************************************
    * Public 公有方法
    ****************************************************************************************************************/
    private constructor() {

    }
    /**
     * 加载json配置文件夹
     * @param path 文件夹路径
     * @param onProgress 加载进度回调
     */
    public loadJsonDir(path = `config/`, onProgress: ((finished: number, total: number, item: AssetManager.RequestItem) => void) = undefined) {

        if (!path.endsWith("/")) { path += "/" };

        let promise: Promise<JsonAsset[]> = new Promise((resolve, reject) => {
            resources.loadDir(path, onProgress, (error: Error, assets: JsonAsset[]) => {
                if (error) {
                    reject(error);
                    return;
                }

                for (let i = 0; i < assets.length; i++) {
                    const asset = assets[i];
                    if (this.jsonMap.has(asset.name)) {
                        console.warn(`json文件名重复或已经加载: ${asset.name}`);
                    }
                    this.jsonMap.set(asset.name, asset.json);
                }
                resolve(assets);
            });
        })
        return promise;
    }

    /**
     * 获取json配置文件
     * @param name 文件名
     */
    public getJson(name: string) {
        if (!this.jsonMap.has(name)) {
            console.warn(`json文件不存在: ${name} 请检查文件名或者确认文件是否加载完成`);
            return null;
        }
        return this.jsonMap.get(name);
    }
    /****************************************************************************************************************
     * private 私有方法
     ****************************************************************************************************************/
    /****************************************************************************************************************
     * Property Get && Set 属性的 get && set 函数
     ****************************************************************************************************************/
    public static get singleton(): ResourceManageSingleton {
        if (!ResourceManageSingleton._singleton) {
            ResourceManageSingleton._singleton = new ResourceManageSingleton();
        }
        return ResourceManageSingleton._singleton;
    }
}